From 51021f88c5cd7b202b15b8cc81010502dd7e082d Mon Sep 17 00:00:00 2001 From: Owen Taylor Date: Sat, 5 Sep 1998 21:22:51 +0000 Subject: [PATCH] When the pointer is grabbed on an input window, either explicitely, or Sat Sep 5 16:01:19 1998 Owen Taylor * gdk/gdkinputxfree.h gdk/gdk.c gdk/gdkinputgxi.h: When the pointer is grabbed on an input window, either explicitely, or through press-grab, and then grabbed on a non-input window, ungrab the devices. --- ChangeLog | 8 +++++ ChangeLog.pre-2-0 | 8 +++++ ChangeLog.pre-2-10 | 8 +++++ ChangeLog.pre-2-2 | 8 +++++ ChangeLog.pre-2-4 | 8 +++++ ChangeLog.pre-2-6 | 8 +++++ ChangeLog.pre-2-8 | 8 +++++ gdk/gdk.c | 3 +- gdk/gdkinputgxi.h | 19 ++++++++-- gdk/gdkinputxfree.h | 78 ++++++++++++++++++++++++++-------------- gdk/x11/gdkinput-gxi.c | 19 ++++++++-- gdk/x11/gdkinput-xfree.c | 78 ++++++++++++++++++++++++++-------------- gdk/x11/gdkmain-x11.c | 3 +- 13 files changed, 194 insertions(+), 62 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6e0ce07385..4bf393e404 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Sat Sep 5 16:01:19 1998 Owen Taylor + + * gdk/gdkinputxfree.h gdk/gdk.c gdk/gdkinputgxi.h: + When the pointer is grabbed on an input window, + either explicitely, or through press-grab, and + then grabbed on a non-input window, ungrab the + devices. + Sat Sep 5 07:13:19 1998 Tim Janik * gtk/gtktypeutils.h: don't include any gdk headers. diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 6e0ce07385..4bf393e404 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,11 @@ +Sat Sep 5 16:01:19 1998 Owen Taylor + + * gdk/gdkinputxfree.h gdk/gdk.c gdk/gdkinputgxi.h: + When the pointer is grabbed on an input window, + either explicitely, or through press-grab, and + then grabbed on a non-input window, ungrab the + devices. + Sat Sep 5 07:13:19 1998 Tim Janik * gtk/gtktypeutils.h: don't include any gdk headers. diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 6e0ce07385..4bf393e404 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,11 @@ +Sat Sep 5 16:01:19 1998 Owen Taylor + + * gdk/gdkinputxfree.h gdk/gdk.c gdk/gdkinputgxi.h: + When the pointer is grabbed on an input window, + either explicitely, or through press-grab, and + then grabbed on a non-input window, ungrab the + devices. + Sat Sep 5 07:13:19 1998 Tim Janik * gtk/gtktypeutils.h: don't include any gdk headers. diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 6e0ce07385..4bf393e404 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,11 @@ +Sat Sep 5 16:01:19 1998 Owen Taylor + + * gdk/gdkinputxfree.h gdk/gdk.c gdk/gdkinputgxi.h: + When the pointer is grabbed on an input window, + either explicitely, or through press-grab, and + then grabbed on a non-input window, ungrab the + devices. + Sat Sep 5 07:13:19 1998 Tim Janik * gtk/gtktypeutils.h: don't include any gdk headers. diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 6e0ce07385..4bf393e404 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,11 @@ +Sat Sep 5 16:01:19 1998 Owen Taylor + + * gdk/gdkinputxfree.h gdk/gdk.c gdk/gdkinputgxi.h: + When the pointer is grabbed on an input window, + either explicitely, or through press-grab, and + then grabbed on a non-input window, ungrab the + devices. + Sat Sep 5 07:13:19 1998 Tim Janik * gtk/gtktypeutils.h: don't include any gdk headers. diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 6e0ce07385..4bf393e404 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,11 @@ +Sat Sep 5 16:01:19 1998 Owen Taylor + + * gdk/gdkinputxfree.h gdk/gdk.c gdk/gdkinputgxi.h: + When the pointer is grabbed on an input window, + either explicitely, or through press-grab, and + then grabbed on a non-input window, ungrab the + devices. + Sat Sep 5 07:13:19 1998 Tim Janik * gtk/gtktypeutils.h: don't include any gdk headers. diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 6e0ce07385..4bf393e404 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,11 @@ +Sat Sep 5 16:01:19 1998 Owen Taylor + + * gdk/gdkinputxfree.h gdk/gdk.c gdk/gdkinputgxi.h: + When the pointer is grabbed on an input window, + either explicitely, or through press-grab, and + then grabbed on a non-input window, ungrab the + devices. + Sat Sep 5 07:13:19 1998 Tim Janik * gtk/gtktypeutils.h: don't include any gdk headers. diff --git a/gdk/gdk.c b/gdk/gdk.c index 1932d7d3bc..5494657e7d 100644 --- a/gdk/gdk.c +++ b/gdk/gdk.c @@ -1307,8 +1307,7 @@ gdk_pointer_grab (GdkWindow * window, xevent_mask |= event_mask_table[i]; } - if (((GdkWindowPrivate *)window)->extension_events && - gdk_input_vtable.grab_pointer) + if (gdk_input_vtable.grab_pointer) return_val = gdk_input_vtable.grab_pointer (window, owner_events, event_mask, diff --git a/gdk/gdkinputgxi.h b/gdk/gdkinputgxi.h index 74b3c0639a..b4f3312838 100644 --- a/gdk/gdkinputgxi.h +++ b/gdk/gdkinputgxi.h @@ -593,16 +593,31 @@ gdk_input_gxi_grab_pointer (GdkWindow * window, { GdkInputWindow *input_window, *new_window; GList *tmp_list; + GdkDevicePrivate *gdkdev; + GList *tmp_list; tmp_list = gdk_input_windows; while (tmp_list) { input_window = (GdkInputWindow *)tmp_list->data; - if (input_window->grabbed) - return AlreadyGrabbed; if (input_window->window == window) new_window = input_window; + else (input_window->grabbed) + input_window->grabbed = FALSE; + + tmp_list = gdk_input_devices; + while (tmp_list) + { + gdkdev = (GdkDevicePrivate *)tmp_list->data; + if (gdkdev->info.deviceid != GDK_CORE_POINTER && + gdkdev->xdevice && + (gdkdev->button_state != 0)) + gdkdev->button_state = 0; + + tmp_list = tmp_list->next; + } + tmp_list = tmp_list->next; } diff --git a/gdk/gdkinputxfree.h b/gdk/gdkinputxfree.h index c0411a4fea..997fdd207b 100644 --- a/gdk/gdkinputxfree.h +++ b/gdk/gdkinputxfree.h @@ -257,6 +257,7 @@ gdk_input_xfree_grab_pointer (GdkWindow * window, guint32 time) { GdkInputWindow *input_window, *new_window; + gboolean need_ungrab; GdkDevicePrivate *gdkdev; GList *tmp_list; XEventClass event_classes[GDK_MAX_DEVICE_CLASSES]; @@ -265,47 +266,70 @@ gdk_input_xfree_grab_pointer (GdkWindow * window, tmp_list = gdk_input_windows; new_window = NULL; + need_ungrab = FALSE; + while (tmp_list) { input_window = (GdkInputWindow *)tmp_list->data; - if (input_window->grabbed) - return AlreadyGrabbed; if (input_window->window == window) new_window = input_window; - + else if (input_window->grabbed) + { + input_window->grabbed = FALSE; + need_ungrab = TRUE; + } + tmp_list = tmp_list->next; } - - g_return_val_if_fail (new_window != NULL, Success); /* shouldn't happen */ - - new_window->grabbed = TRUE; - tmp_list = gdk_input_devices; - while (tmp_list) + if (new_window) { - gdkdev = (GdkDevicePrivate *)tmp_list->data; - if (gdkdev->info.deviceid != GDK_CORE_POINTER && - gdkdev->xdevice) + new_window->grabbed = TRUE; + + tmp_list = gdk_input_devices; + while (tmp_list) + { + gdkdev = (GdkDevicePrivate *)tmp_list->data; + if (gdkdev->info.deviceid != GDK_CORE_POINTER && + gdkdev->xdevice) + { + gdk_input_common_find_events (window, gdkdev, + event_mask, + event_classes, &num_classes); + + result = XGrabDevice( GDK_DISPLAY(), gdkdev->xdevice, + GDK_WINDOW_XWINDOW (window), + owner_events, num_classes, event_classes, + GrabModeAsync, GrabModeAsync, time); + + /* FIXME: if failure occurs on something other than the first + device, things will be badly inconsistent */ + if (result != Success) + return result; + } + tmp_list = tmp_list->next; + } + } + else + { + tmp_list = gdk_input_devices; + while (tmp_list) { - gdk_input_common_find_events (window, gdkdev, - event_mask, - event_classes, &num_classes); - - result = XGrabDevice( GDK_DISPLAY(), gdkdev->xdevice, - GDK_WINDOW_XWINDOW (window), - owner_events, num_classes, event_classes, - GrabModeAsync, GrabModeAsync, time); - - /* FIXME: if failure occurs on something other than the first - device, things will be badly inconsistent */ - if (result != Success) - return result; + gdkdev = (GdkDevicePrivate *)tmp_list->data; + if (gdkdev->info.deviceid != GDK_CORE_POINTER && gdkdev->xdevice && + ((gdkdev->button_state != 0) || need_ungrab)) + { + XUngrabDevice( gdk_display, gdkdev->xdevice, time); + gdkdev->button_state = 0; + } + + tmp_list = tmp_list->next; } - tmp_list = tmp_list->next; } - + return Success; + } static void diff --git a/gdk/x11/gdkinput-gxi.c b/gdk/x11/gdkinput-gxi.c index 74b3c0639a..b4f3312838 100644 --- a/gdk/x11/gdkinput-gxi.c +++ b/gdk/x11/gdkinput-gxi.c @@ -593,16 +593,31 @@ gdk_input_gxi_grab_pointer (GdkWindow * window, { GdkInputWindow *input_window, *new_window; GList *tmp_list; + GdkDevicePrivate *gdkdev; + GList *tmp_list; tmp_list = gdk_input_windows; while (tmp_list) { input_window = (GdkInputWindow *)tmp_list->data; - if (input_window->grabbed) - return AlreadyGrabbed; if (input_window->window == window) new_window = input_window; + else (input_window->grabbed) + input_window->grabbed = FALSE; + + tmp_list = gdk_input_devices; + while (tmp_list) + { + gdkdev = (GdkDevicePrivate *)tmp_list->data; + if (gdkdev->info.deviceid != GDK_CORE_POINTER && + gdkdev->xdevice && + (gdkdev->button_state != 0)) + gdkdev->button_state = 0; + + tmp_list = tmp_list->next; + } + tmp_list = tmp_list->next; } diff --git a/gdk/x11/gdkinput-xfree.c b/gdk/x11/gdkinput-xfree.c index c0411a4fea..997fdd207b 100644 --- a/gdk/x11/gdkinput-xfree.c +++ b/gdk/x11/gdkinput-xfree.c @@ -257,6 +257,7 @@ gdk_input_xfree_grab_pointer (GdkWindow * window, guint32 time) { GdkInputWindow *input_window, *new_window; + gboolean need_ungrab; GdkDevicePrivate *gdkdev; GList *tmp_list; XEventClass event_classes[GDK_MAX_DEVICE_CLASSES]; @@ -265,47 +266,70 @@ gdk_input_xfree_grab_pointer (GdkWindow * window, tmp_list = gdk_input_windows; new_window = NULL; + need_ungrab = FALSE; + while (tmp_list) { input_window = (GdkInputWindow *)tmp_list->data; - if (input_window->grabbed) - return AlreadyGrabbed; if (input_window->window == window) new_window = input_window; - + else if (input_window->grabbed) + { + input_window->grabbed = FALSE; + need_ungrab = TRUE; + } + tmp_list = tmp_list->next; } - - g_return_val_if_fail (new_window != NULL, Success); /* shouldn't happen */ - - new_window->grabbed = TRUE; - tmp_list = gdk_input_devices; - while (tmp_list) + if (new_window) { - gdkdev = (GdkDevicePrivate *)tmp_list->data; - if (gdkdev->info.deviceid != GDK_CORE_POINTER && - gdkdev->xdevice) + new_window->grabbed = TRUE; + + tmp_list = gdk_input_devices; + while (tmp_list) + { + gdkdev = (GdkDevicePrivate *)tmp_list->data; + if (gdkdev->info.deviceid != GDK_CORE_POINTER && + gdkdev->xdevice) + { + gdk_input_common_find_events (window, gdkdev, + event_mask, + event_classes, &num_classes); + + result = XGrabDevice( GDK_DISPLAY(), gdkdev->xdevice, + GDK_WINDOW_XWINDOW (window), + owner_events, num_classes, event_classes, + GrabModeAsync, GrabModeAsync, time); + + /* FIXME: if failure occurs on something other than the first + device, things will be badly inconsistent */ + if (result != Success) + return result; + } + tmp_list = tmp_list->next; + } + } + else + { + tmp_list = gdk_input_devices; + while (tmp_list) { - gdk_input_common_find_events (window, gdkdev, - event_mask, - event_classes, &num_classes); - - result = XGrabDevice( GDK_DISPLAY(), gdkdev->xdevice, - GDK_WINDOW_XWINDOW (window), - owner_events, num_classes, event_classes, - GrabModeAsync, GrabModeAsync, time); - - /* FIXME: if failure occurs on something other than the first - device, things will be badly inconsistent */ - if (result != Success) - return result; + gdkdev = (GdkDevicePrivate *)tmp_list->data; + if (gdkdev->info.deviceid != GDK_CORE_POINTER && gdkdev->xdevice && + ((gdkdev->button_state != 0) || need_ungrab)) + { + XUngrabDevice( gdk_display, gdkdev->xdevice, time); + gdkdev->button_state = 0; + } + + tmp_list = tmp_list->next; } - tmp_list = tmp_list->next; } - + return Success; + } static void diff --git a/gdk/x11/gdkmain-x11.c b/gdk/x11/gdkmain-x11.c index 1932d7d3bc..5494657e7d 100644 --- a/gdk/x11/gdkmain-x11.c +++ b/gdk/x11/gdkmain-x11.c @@ -1307,8 +1307,7 @@ gdk_pointer_grab (GdkWindow * window, xevent_mask |= event_mask_table[i]; } - if (((GdkWindowPrivate *)window)->extension_events && - gdk_input_vtable.grab_pointer) + if (gdk_input_vtable.grab_pointer) return_val = gdk_input_vtable.grab_pointer (window, owner_events, event_mask, -- 2.30.2